Lambda 上で動作していたアプリのエラーが解消できた話
こんにちは、高崎@アノテーション です。
はじめに
最近、とある Node.js の Lambda 上で動作していたサーバーレスアプリ環境でエラーが頻繁に発生し、その調査に追われていました。
ところが最近、とある施策を行ったところそのエラーが発生しなくなったため、皆様の参考になるかと思い、事例として記事にいたします。
環境について
当該環境は、端末から API Gateway を介して Lambda を動作させるもので、エラーが発生すると console.error
にてログ出力するものを CloudWatch Alarm が検知して Amazon SNS にて通知する仕組みです。
その部分の構成図を簡単に記載しておきます。
ローンチの時、例外処理は基本的にエラー扱いをしますが、調査を行い複雑な運用を必要とせずに容易に復帰するものは運用保守の段階で console.error
→ console.info
に変更してログのレベルを下げる施策を行うこともあります。
エラーの内容
今回のエラーは fetch failed で、1〜2日で1回、多いときで1日に2〜3回発生していました。
一部抜粋したログを添付します。
"data": {
"name": "TypeError",
"location": "/node_modules/cls-hooked/context.js:172",
"message": "fetch failed",
"stack": スタックは省略,
"cause": {
"name": "Error",
"location": "node:internal/stream_base_commons:95",
"message": "write ETIMEDOUT",
"stack": スタックは省略
}
:
対応検討
ローンチの段階で調査用に fetch が呼ばれる前に関係するデータをログに表示させていたのですが、エラー発生に関連するものは無く、エンドユーザーにてリトライを行った形跡も有ったため、以後ログのレベルを下げる案もありました。
しかし、致命的なエラーを拾えない可能性も捨てきれなかったためレベルを下げる案は取り下げ、fetch の実装替えを検討していたところ、メンバー より以下の情報を頂きました。
Node.js v21 release note -stable fetchwebstreams-
fetch の動作が Node.js 21 以降で安定して動作するという主旨のものだったのですが、Lambda の Node.js のバージョンはサポート最新は 20 で残念、と思っていたさなかにこんなリリースが。
キター。
Node.js 22 にする
環境は TypeScript による cdk で構築しており、aws-cdk を最新にしておおよそ下記のように修正。
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as nodejs from "aws-cdk-lib/aws-lambda-nodejs";
:
const functionName = ※ここで Lambda の関数名を定義
new nodejs.NodejsFunction(this, `${functionName}-Lambda`,
- runtime: lambda.Runtime.NODEJS_20_X,
+ runtime: lambda.Runtime.NODEJS_22_X,
:
根幹のランタイムを変えたことにより、一通りの回帰テストを実施してデプロイ、これを書いている現在は数週間経ちましたが、幸いエラーは発生せず安定的に稼働しています。
まとめ
できるだけライブラリ関連は最新にすることで安定稼働する可能性が高まると思います。
なお、紹介した記事にもあります通り、ランタイムの指定を NODEJS_LATEST
にすると Node.js 18 が指定されるようですので、バージョンは明示的に指定する必要があります。
この記事が皆様の参考になれば幸いです。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。